//
// Copyright (c) 2011 Alex Nesterenko
//

#include "nane/core/crt/POSIX/POSIXFileSystemImpl_.h"
#include "nane/core/crt/POSIX/POSIXReadFile_.h"
#include "nane/core/crt/POSIX/POSIXWriteFile_.h"

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>

namespace nane 
{
    ////////////////////////////////////////////////////////////////////////////////////////////////
    FileSystem::Implementation::Implementation( )
    {

    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    FileSystem::Implementation::~Implementation( )
    {

    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    bool FileSystem::Implementation::initialize()
    {
        return true;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void FileSystem::Implementation::shutdown()
    {
        
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    IReadFile* FileSystem::Implementation::openReadFile( const char* _filename )
    {
        POSIXReadFile* readFile = NULL;
        int hFile = ::open(_filename, O_RDONLY, S_IRWXU);
        if( hFile != -1 )
        {
            readFile = new POSIXReadFile(this, hFile, _filename);
        }
        return readFile;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    IWriteFile* FileSystem::Implementation::openWriteFile( const char* _filename )
    {
        POSIXWriteFile* writeFile = NULL;
        int hFile = ::open(_filename, O_WRONLY | O_CREAT, S_IRWXU);
        if( hFile != -1 )
        {
            writeFile = new POSIXWriteFile(this, hFile, _filename);
        }
        return writeFile;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    bool FileSystem::Implementation::exists( const char* _filename )
    {
        return ::access(_filename, F_OK) == 0;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    bool FileSystem::Implementation::deleteFile( const char* _filename )
    {
        return ::remove(_filename) == 0;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    bool FileSystem::Implementation::createFolder( const char* _path )
    {
#if defined(__MINGW32__)
        return ::mkdir(_path) == 0;
#else
        return ::mkdir(_path, S_IRWXU) == 0;
#endif
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    bool FileSystem::Implementation::deleteFolder( const char* _path )
    {
        return ::rmdir(_path) == 0;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void FileSystem::Implementation::release( POSIXReadFile* _posixReadFile )
    {
        ::close(_posixReadFile->m_interface);
        delete _posixReadFile;                
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void FileSystem::Implementation::release( POSIXWriteFile* _posixWriteFile )
    {
        ::close(_posixWriteFile->m_interface);
        delete _posixWriteFile;                
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
}   // namespace nane
